`define RstEnable 1'b1                    // 0x1
`define RstDisable 1'b0                   // 0x0
`define ZeroWord 32'h00000000             // 0x00000000
`define WriteEnable 1'b1                  // 0x1
`define WriteDisable 1'b0                 // 0x0
`define ReadEnable 1'b1                   // 0x1
`define ReadDisable 1'b0                  // 0x0
`define AluOpBus 7:0                      // 8-bit bus
`define AluSelBus 2:0                     // 3-bit bus
`define InstValid 1'b0                    // 0x0
`define InstInvalid 1'b1                  // 0x1
`define Stop 1'b1                         // 0x1
`define NoStop 1'b0                       // 0x0
`define InDelaySlot 1'b1                  // 0x1
`define NotInDelaySlot 1'b0               // 0x0
`define Branch 1'b1                       // 0x1
`define NotBranch 1'b0                    // 0x0
`define InterruptAssert 1'b1              // 0x1
`define InterruptNotAssert 1'b0           // 0x0
`define TrapAssert 1'b1                   // 0x1
`define TrapNotAssert 1'b0                // 0x0
`define True_v 1'b1                       // 0x1
`define False_v 1'b0                      // 0x0
`define ChipEnable 1'b1                   // 0x1
`define ChipDisable 1'b0                  // 0x0

`define EXE_AND  6'b100100                // 0x24
`define EXE_OR   6'b100101                // 0x25
`define EXE_XOR 6'b100110                 // 0x26
`define EXE_NOR 6'b100111                 // 0x27
`define EXE_ANDI 6'b001100                // 0x0C
`define EXE_ORI  6'b001101                // 0x0D
`define EXE_XORI 6'b001110                // 0x0E
`define EXE_LUI 6'b001111                 // 0x0F

`define EXE_SLL  6'b000000                // 0x00
`define EXE_SLLV  6'b000100               // 0x04
`define EXE_SRL  6'b000010                // 0x02
`define EXE_SRLV  6'b000110               // 0x06
`define EXE_SRA  6'b000011                // 0x03
`define EXE_SRAV  6'b000111               // 0x07
`define EXE_SYNC  6'b001111               // 0x0F
`define EXE_PREF  6'b110011               // 0x33

`define EXE_MOVZ  6'b001010               // 0x0A
`define EXE_MOVN  6'b001011               // 0x0B
`define EXE_MFHI  6'b010000               // 0x10
`define EXE_MTHI  6'b010001               // 0x11
`define EXE_MFLO  6'b010010               // 0x12
`define EXE_MTLO  6'b010011               // 0x13

`define EXE_SLT  6'b101010                // 0x2A
`define EXE_SLTU  6'b101011               // 0x2B
`define EXE_SLTI  6'b001010               // 0x0A
`define EXE_SLTIU  6'b001011              // 0x0B
`define EXE_ADD  6'b100000                // 0x20
`define EXE_ADDU  6'b100001               // 0x21
`define EXE_SUB  6'b100010                // 0x22
`define EXE_SUBU  6'b100011               // 0x23
`define EXE_ADDI  6'b001000               // 0x08
`define EXE_ADDIU  6'b001001              // 0x09
`define EXE_CLZ  6'b100000                // 0x20
`define EXE_CLO  6'b100001                // 0x21

`define EXE_MULT  6'b011000               // 0x18
`define EXE_MULTU  6'b011001              // 0x19
`define EXE_MUL  6'b000010                // 0x02
`define EXE_MADD  6'b000000               // 0x00
`define EXE_MADDU  6'b000001              // 0x01
`define EXE_MSUB  6'b000100               // 0x04
`define EXE_MSUBU  6'b000101              // 0x05

`define EXE_DIV  6'b011010                // 0x1A
`define EXE_DIVU  6'b011011               // 0x1B

`define EXE_J  6'b000010                  // 0x02
`define EXE_JAL  6'b000011                // 0x03
`define EXE_JALR  6'b001001               // 0x09
`define EXE_JR  6'b001000                 // 0x08
`define EXE_BEQ  6'b000100                // 0x04
`define EXE_BGEZ  5'b00001                // 0x01
`define EXE_BGEZAL  5'b10001              // 0x11
`define EXE_BGTZ  6'b000111               // 0x07
`define EXE_BLEZ  6'b000110               // 0x06
`define EXE_BLTZ  5'b00000                // 0x00
`define EXE_BLTZAL  5'b10000              // 0x10
`define EXE_BNE  6'b000101                // 0x05

`define EXE_LB  6'b100000                 // 0x20
`define EXE_LBU  6'b100100                // 0x24
`define EXE_LH  6'b100001                 // 0x21
`define EXE_LHU  6'b100101                // 0x25
`define EXE_LL  6'b110000                 // 0x30
`define EXE_LW  6'b100011                 // 0x23
`define EXE_LWL  6'b100010                // 0x22
`define EXE_LWR  6'b100110                // 0x26
`define EXE_SB  6'b101000                 // 0x28
`define EXE_SC  6'b111000                 // 0x38
`define EXE_SH  6'b101001                 // 0x29
`define EXE_SW  6'b101011                 // 0x2B
`define EXE_SWL  6'b101010                // 0x2A
`define EXE_SWR  6'b101110                // 0x2E

`define EXE_SYSCALL 6'b001100             // 0x0C

`define EXE_TEQ 6'b110100                 // 0x34
`define EXE_TEQI 5'b01100                 // 0x0C
`define EXE_TGE 6'b110000                 // 0x30
`define EXE_TGEI 5'b01000                 // 0x08
`define EXE_TGEIU 5'b01001                // 0x09
`define EXE_TGEU 6'b110001                // 0x31
`define EXE_TLT 6'b110010                 // 0x32
`define EXE_TLTI 5'b01010                 // 0x0A
`define EXE_TLTIU 5'b01011                // 0x0B
`define EXE_TLTU 6'b110011                // 0x33
`define EXE_TNE 6'b110110                 // 0x36
`define EXE_TNEI 5'b01110                 // 0x0E

`define EXE_ERET 32'b01000010000000000000000000011000  // 0x42000018

`define EXE_NOP 6'b000000                 // 0x00
`define SSNOP 32'b00000000000000000000000001000000     // 0x00000040

`define EXE_SPECIAL_INST 6'b000000        // 0x00
`define EXE_REGIMM_INST 6'b000001         // 0x01
`define EXE_SPECIAL2_INST 6'b011100       // 0x1C

//AluOp
`define EXE_AND_OP   8'b00100100          // 0x24
`define EXE_OR_OP    8'b00100101          // 0x25
`define EXE_XOR_OP  8'b00100110           // 0x26
`define EXE_NOR_OP  8'b00100111           // 0x27
`define EXE_ANDI_OP  8'b01011001          // 0x59
`define EXE_ORI_OP  8'b01011010           // 0x5A
`define EXE_XORI_OP  8'b01011011          // 0x5B
`define EXE_LUI_OP  8'b01011100           // 0x5C

`define EXE_SLL_OP  8'b01111100           // 0x7C
`define EXE_SLLV_OP  8'b00000100          // 0x04
`define EXE_SRL_OP  8'b00000010           // 0x02
`define EXE_SRLV_OP  8'b00000110          // 0x06
`define EXE_SRA_OP  8'b00000011           // 0x03
`define EXE_SRAV_OP  8'b00000111          // 0x07

`define EXE_MOVZ_OP  8'b00001010          // 0x0A
`define EXE_MOVN_OP  8'b00001011          // 0x0B
`define EXE_MFHI_OP  8'b00010000          // 0x10
`define EXE_MTHI_OP  8'b00010001          // 0x11
`define EXE_MFLO_OP  8'b00010010          // 0x12
`define EXE_MTLO_OP  8'b00010011          // 0x13

`define EXE_SLT_OP  8'b00101010           // 0x2A
`define EXE_SLTU_OP  8'b00101011          // 0x2B
`define EXE_SLTI_OP  8'b01010111          // 0x57
`define EXE_SLTIU_OP  8'b01011000         // 0x58
`define EXE_ADD_OP  8'b00100000           // 0x20
`define EXE_ADDU_OP  8'b00100001          // 0x21
`define EXE_SUB_OP  8'b00100010           // 0x22
`define EXE_SUBU_OP  8'b00100011          // 0x23
`define EXE_ADDI_OP  8'b01010101          // 0x55
`define EXE_ADDIU_OP  8'b01010110         // 0x56
`define EXE_CLZ_OP  8'b10110000           // 0xB0
`define EXE_CLO_OP  8'b10110001           // 0xB1

`define EXE_MULT_OP  8'b00011000          // 0x18
`define EXE_MULTU_OP  8'b00011001         // 0x19
`define EXE_MUL_OP  8'b10101001           // 0xA9
`define EXE_MADD_OP  8'b10100110          // 0xA6
`define EXE_MADDU_OP  8'b10101000         // 0xA8
`define EXE_MSUB_OP  8'b10101010          // 0xAA
`define EXE_MSUBU_OP  8'b10101011         // 0xAB

`define EXE_DIV_OP  8'b00011010           // 0x1A
`define EXE_DIVU_OP  8'b00011011          // 0x1B

`define EXE_J_OP  8'b01001111             // 0x4F
`define EXE_JAL_OP  8'b01010000           // 0x50
`define EXE_JALR_OP  8'b00001001          // 0x09
`define EXE_JR_OP  8'b00001000            // 0x08
`define EXE_BEQ_OP  8'b01010001           // 0x51
`define EXE_BGEZ_OP  8'b01000001          // 0x41
`define EXE_BGEZAL_OP  8'b01001011        // 0x4B
`define EXE_BGTZ_OP  8'b01010100          // 0x54
`define EXE_BLEZ_OP  8'b01010011          // 0x53
`define EXE_BLTZ_OP  8'b01000000          // 0x40
`define EXE_BLTZAL_OP  8'b01001010        // 0x4A
`define EXE_BNE_OP  8'b01010010           // 0x52

`define EXE_LB_OP  8'b11100000            // 0xE0
`define EXE_LBU_OP  8'b11100100           // 0xE4
`define EXE_LH_OP  8'b11100001            // 0xE1
`define EXE_LHU_OP  8'b11100101           // 0xE5
`define EXE_LL_OP  8'b11110000            // 0xF0
`define EXE_LW_OP  8'b11100011            // 0xE3
`define EXE_LWL_OP  8'b11100010           // 0xE2
`define EXE_LWR_OP  8'b11100110           // 0xE6
`define EXE_PREF_OP  8'b11110011          // 0xF3
`define EXE_SB_OP  8'b11101000            // 0xE8
`define EXE_SC_OP  8'b11111000            // 0xF8
`define EXE_SH_OP  8'b11101001            // 0xE9
`define EXE_SW_OP  8'b11101011            // 0xEB
`define EXE_SWL_OP  8'b11101010           // 0xEA
`define EXE_SWR_OP  8'b11101110           // 0xEE
`define EXE_SYNC_OP  8'b00001111          // 0x0F

`define EXE_MFC0_OP 8'b01011101           // 0x5D
`define EXE_MTC0_OP 8'b01100000           // 0x60

`define EXE_SYSCALL_OP 8'b00001100        // 0x0C

`define EXE_TEQ_OP 8'b00110100            // 0x34
`define EXE_TEQI_OP 8'b01001000           // 0x48
`define EXE_TGE_OP 8'b00110000            // 0x30
`define EXE_TGEI_OP 8'b01000100           // 0x44
`define EXE_TGEIU_OP 8'b01000101          // 0x45
`define EXE_TGEU_OP 8'b00110001           // 0x31
`define EXE_TLT_OP 8'b00110010            // 0x32
`define EXE_TLTI_OP 8'b01000110           // 0x46
`define EXE_TLTIU_OP 8'b01000111          // 0x47
`define EXE_TLTU_OP 8'b00110011           // 0x33
`define EXE_TNE_OP 8'b00110110            // 0x36
`define EXE_TNEI_OP 8'b01001001           // 0x49

`define EXE_ERET_OP 8'b01101011           // 0x6B

`define EXE_NOP_OP    8'b00000000         // 0x00

//AluSel
`define EXE_RES_LOGIC 3'b001              // 0x1
`define EXE_RES_SHIFT 3'b010              // 0x2
`define EXE_RES_MOVE 3'b011               // 0x3
`define EXE_RES_ARITHMETIC 3'b100         // 0x4
`define EXE_RES_MUL 3'b101                // 0x5
`define EXE_RES_JUMP_BRANCH 3'b110        // 0x6
`define EXE_RES_LOAD_STORE 3'b111         // 0x7

`define EXE_RES_NOP 3'b000                // 0x0

`define StallBus 5:0                      // 6-bit bus
`define InstAddrBus 31:0                  // 32-bit bus
`define InstBus 31:0                      // 32-bit bus
`define InstMemNum 131071                 // 0x1FFFF
`define InstMemNumLog2 17                 // 0x11

`define DataAddrBus 31:0                  // 32-bit bus
`define DataBus 31:0                      // 32-bit bus
`define DataMemNum 131071                 // 0x1FFFF
`define DataMemNumLog2 17                 // 0x11
`define ByteWidth 7:0                     // 8-bit bus

`define RegAddrBus 4:0                    // 5-bit bus
`define RegBus 31:0                       // 32-bit bus
`define RegWidth 32                       // 0x20
`define DoubleRegWidth 64                 // 0x40
`define DoubleRegBus 63:0                 // 64-bit bus
`define RegNum 32                         // 0x20
`define RegNumLog2 5                      // 0x5
`define NOPRegAddr 5'b00000               // 0x00

`define DivFree 2'b00                     // 0x0
`define DivByZero 2'b01                   // 0x1
`define DivOn 2'b10                       // 0x2
`define DivEnd 2'b11                      // 0x3
`define DivResultReady 1'b1               // 0x1
`define DivResultNotReady 1'b0            // 0x0
`define DivStart 1'b1                     // 0x1
`define DivStop 1'b0                      // 0x0

`define CP0_REG_COUNT    5'b01001         // 0x09 - 可读写
`define CP0_REG_COMPARE    5'b01011       // 0x0B - 可读写
`define CP0_REG_STATUS    5'b01100        // 0x0C - 可读写
`define CP0_REG_CAUSE    5'b01101         // 0x0D - 只读
`define CP0_REG_EPC    5'b01110           // 0x0E - 可读写
`define CP0_REG_PrId    5'b01111          // 0x0F - 只读
`define CP0_REG_CONFIG    5'b10000        // 0x10 - 只读

`define WB_IDLE 2'b00                     // 0x0
`define WB_BUSY 2'b01                     // 0x1
`define WB_WAIT_FOR_FLUSHING 2'b10        // 0x2
`define WB_WAIT_FOR_STALL 2'b11           // 0x3

`define STALL_PC 0                        // 0x0
`define STALL_IF 1                        // 0x1
`define STALL_ID 2                        // 0x2
`define STALL_EX 3                        // 0x3
`define STALL_MEM 4                       // 0x4
`define STALL_WB 5                        // 0x5
